package it.uiip.crm.control;

import java.util.Iterator;
import java.util.List;

import it.uiip.crm.model.Anagrafica;
import it.uiip.crm.model.Post;
import it.uiip.crm.model.Utente;
import it.uiip.crm.persistenza.PersistenceManager;
import it.uiip.crm.view.InterfacciaUtente;
import it.uiip.crm.view.Messaggi;

/**
 * FacebookController
 * @author Gruppo 
 */
public class FacebookController implements InterfacciaUtente {
	private int risposta = 0;
	
	private Utente utenteLoggato;

	private ControlloAggiornaAnagrafica controlloAggiornaAnagrafica;
	private ControlloAggiornaUtente controlloAggiornautente;
	
	private ControlloInserisciUtente controlloInserisciUtente;
	private ControlloInserisciAnagrafica controlloInserisciAnagrafica;
	private ControlloInserisciPost controlloInserisciPost;
	
	private ControlloCercaUtente controlloCercaUtente;

	private ControlloAggiungiAmicizia controlloAggiungiAmicizia;
	private ControlloEliminaAmicizia controlloEliminaAmicizia;
	private ControlloConfermaAmicizia controlloConfermaAmicizia;
	
	private ControlloEliminaAnagrafica controlloEliminaAnagrafica;
	private ControlloEliminaPost controlloEliminaPost;

	//private ControlloCercaAnagrafica controlloCercaAnagrafica;
	private ControlloCercaPost controlloCercaPost;
	private ControlloEliminaUtente controlloEliminaUtente;
	private ControlloAggiornaPost controlloAggiornaPost;
		
	/** 
	 * Costruttore di FacebookController.
	 */	
	public FacebookController() {
		controlloAggiornaAnagrafica=new ControlloAggiornaAnagrafica();
		controlloAggiornaPost=new ControlloAggiornaPost();
		controlloAggiornautente=new ControlloAggiornaUtente();
		
		controlloInserisciUtente=new ControlloInserisciUtente();
		controlloInserisciAnagrafica=new ControlloInserisciAnagrafica();
		controlloInserisciPost=new ControlloInserisciPost();
		
		controlloCercaPost=new ControlloCercaPost();
		controlloCercaUtente=new ControlloCercaUtente();
		
		controlloEliminaAnagrafica=new ControlloEliminaAnagrafica();
		controlloEliminaPost=new ControlloEliminaPost();
		controlloEliminaUtente=new ControlloEliminaUtente();
		
		controlloAggiungiAmicizia= new ControlloAggiungiAmicizia();
		controlloEliminaAmicizia= new ControlloEliminaAmicizia();
		controlloConfermaAmicizia= new ControlloConfermaAmicizia();

		//controlloCercaAnagrafica=new ControlloCercaAnagrafica();
	}

	/**
	 * Menu dell'utente.
	 */
	public void menuIniziale(){
		Messaggi.mostraSaluti("inizio.png");
		while(true){
			try{
				String stringaInput = Messaggi.getInput("Scegli l'opzione: \n"  +
						"	      1  per LOGIN UTENTE\n" +
						"      2  per REGISTRAZIONE UTENTE\n" +
						"      0  per ESCI\n");
				risposta = Integer.parseInt(stringaInput);

			    switch(risposta) {
			    	case 1:
			    		this.utenteLoggato=null;
			    		loginUtente();
			    		this.avviaMenuIniziale();
			    		break;
			    	case 2:
			    		controlloInserisciUtente.start(null);
			    		break;
			    	case 0:
			    		Messaggi.mostraSaluti("fine.png");
			    		System.exit(0);
			    		return;
			    	default:
						Messaggi.mostraMessaggio("L'input non e' valido.");
			    		break;
			    }
			} catch(NumberFormatException ex){
				Messaggi.mostraMessaggio("L'input non e' valido.");
				ex.printStackTrace();
			} catch(Exception ex){
				Messaggi.mostraMessaggioErrore(ex.getMessage());
				ex.printStackTrace();
			}finally{
				PersistenceManager.closeSession();
			}
		}
	}	
	
	private void avviaMenuIniziale() {
		if(this.getUtenteLoggato()==null) return;
		if(this.getUtenteLoggato().isTipoUtente()){
			this.menuInizialeAmministratore();
		}else{
			this.menuInizialeUtente();
		}
	}
	
	private void menuInizialeAmministratore() {
		while(true){
			try{
				String stringaInput = Messaggi.getInput("Scegli l'opzione: \n"  +
						"	      1  per GESTISCI AMICI\n" +
						"      2  per GESTISCI MESSAGGI\n" +
						"      0  per ESCI\n");
				risposta = Integer.parseInt(stringaInput);

			    switch(risposta) {
			    	case 1:
			    		this.avviaMenuIniziale();
			    		break;
			    	case 2:
			    		//TODO Gestisci messaggi
			    		break;
			    	case 0:
			    		return;
			    	default:
						Messaggi.mostraMessaggio("L'input non e' valido.");
			    		break;
			    }
			} catch(NumberFormatException ex){
				Messaggi.mostraMessaggio("L'input non e' valido.");
				ex.printStackTrace();
			} catch(Exception ex){
				Messaggi.mostraMessaggioErrore(ex.getMessage());
				ex.printStackTrace();
			}
		}
	}
	
	private void menuInizialeUtente() {
		while(true){
			try{
				String stringaInput = Messaggi.getInput("Scegli l'opzione: \n"  +
						"	      1  per GESTISCI AMICI\n" +
						"      2  per GESTISCI MESSAGGI\n" +
						"      3  per GESTISCI ANAGRAFICA\n" +
						"      0  per ESCI\n");
				risposta = Integer.parseInt(stringaInput);

			    switch(risposta) {
			    	case 1:
			    		this.menuOperazioniUtenteSuAmicizia();
			    		break;
			    	case 2:
			    		this.menuOperazioniUtenteSuPost();
			    		break;
			    	case 3:
			    		this.menuOperazioniSuAnagrafica();
			    		break;
			    	case 0: 
			    		return;
			    	default:
						Messaggi.mostraMessaggio("L'input non e' valido.");
			    		break;
			    }
			} catch(NumberFormatException ex){
				Messaggi.mostraMessaggio("L'input non e' valido.");
				ex.printStackTrace();
			} catch(Exception ex){
				Messaggi.mostraMessaggioErrore(ex.getMessage());
				ex.printStackTrace();
			}
		}
	}
	
	private void menuOperazioniSuAnagrafica() {
		while(true){
			try{
				String stringaInput = Messaggi.getInput("Scegli l'opzione: \n"  +
						"	      1  per INSERISCI ANAGRAFICA\n" +
						"      2  per MODIFICA ANAGRAFICA\n" +
						"      3  per ELIMINA ANAGRAFICA\n" +
						"      0  per ESCI\n");
				risposta = Integer.parseInt(stringaInput);

			    switch(risposta) {
		    		case 1:
			    		this.controlloInserisciAnagrafica.start(utenteLoggato);
			    		break;
			    	case 2:
			    		this.controlloAggiornaAnagrafica.start(utenteLoggato);
			    		break;
			    	case 3:
			    		this.controlloEliminaAnagrafica.start(utenteLoggato);
			    		break;
			    	case 0: 
			    		return;
			    	default:
						Messaggi.mostraMessaggio("L'input non e' valido.");
			    		break;
			    }
			} catch(NumberFormatException ex){
				Messaggi.mostraMessaggio("L'input non e' valido.");
				ex.printStackTrace();
			} catch(Exception ex){
				Messaggi.mostraMessaggioErrore(ex.getMessage());
				ex.printStackTrace();
			}
		}
	}

	private Utente getUtenteLoggato() {
		return this.utenteLoggato;
	}

	public void menuOperazioniUtenteSuPost(){
		while(true){
			try{
				String stringaInput = Messaggi.getInput(
						"	Scegli l'opzione: \n"  +
						"	   1  per INSERISCI UN POST\n" +
						"      2  per VISUALIZZA POST\n" +
						"      3  per CANCELLA POST\n" +	
						"      0  per ESCI\n");
				risposta = Integer.parseInt(stringaInput);

			    switch(risposta) {
			    	case 1:
			    		this.controlloInserisciPost.start(this.getUtenteLoggato());
			    		break;
			    	case 2:
			    		Messaggi.mostraLista(this.getUtenteLoggato().getPosts());
			    		break;
			    	case 3:
			    		Object scelta=Messaggi.scegliDaLista("Scegli il post da eliminare: " , this.utenteLoggato.getPosts());
			    		if(scelta instanceof Post){
			    			this.controlloEliminaPost.eliminaPost((Post) scelta);
			    			this.controlloAggiornautente.aggiornaUtente(this.getUtenteLoggato());
			    		}
			    		break;
			    	case 0:
			    		return;
			    	default:
						Messaggi.mostraMessaggio("L'input non e' valido.");
			    		break;
			    }
			} catch(NumberFormatException ex){
				Messaggi.mostraMessaggio("L'input non e' valido.");
				ex.printStackTrace();
			} catch(Exception ex){
				Messaggi.mostraMessaggioErrore(ex.getMessage());
				ex.printStackTrace();
			}
		}
	}

	public void menuOperazioniUtenteSuAmicizia(){
		while(true){
			try{
				String stringaInput = Messaggi.getInput(
						"	Scegli l'opzione: \n"  +
						"	   1  per INSERISCI UN AMICO\n" +
						"      2  per CANCELLA UN AMICO\n" +	
						"      3  per VISUALIZZA AMICIZIE\n" +
						"      4  per VISUALIZZA AMICIZIE IN SOSPESO\n" +
						"      5  per CONFERMA AMICIZIE IN SOSPESO\n" +
						"      0  per ESCI\n");
				risposta = Integer.parseInt(stringaInput);

			    switch(risposta) {
			    	case 1:
			    		this.controlloAggiungiAmicizia.aggiungiAmicizia(this.getUtenteLoggato());
			    		break;
			    	case 2:
			    		this.controlloEliminaAmicizia.start(this.getUtenteLoggato());
			    		break;
			    	case 3:
			    		List<Utente> amici = this.utenteLoggato.getAmici();
			    		if (amici == null || amici.isEmpty()) {
				    		Messaggi.mostraMessaggio("La lista degli amici è vuota!");
			    		} else {
			    			String messaggio = "";
			    			Iterator<Utente> iter = amici.iterator();
			    			while (iter.hasNext()) {
			    				Utente ut = iter.next();
			    				messaggio += ut.toString() + "\n";
			    			}
				    		Messaggi.mostraLista(messaggio);
			    		}
			    		break;
			    	case 4:
			    		List<Utente> amiciS = this.utenteLoggato.getAmiciInSospeso();
			    		if (amiciS == null || amiciS.isEmpty()) {
				    		Messaggi.mostraMessaggio("La lista degli amici in sospeso è vuota!");
			    		} else {
			    			String messaggio = "";
			    			Iterator<Utente> iter = amiciS.iterator();
			    			while (iter.hasNext()) {
			    				Utente ut = iter.next();
			    				messaggio += ut.toString() + "\n";
			    			}
				    		Messaggi.mostraLista(messaggio);
			    		}
			    		break;
			    	case 5:
			    		this.controlloConfermaAmicizia.start(this.getUtenteLoggato());
			    		break;
			    	case 0:
			    		return;
			    	default:
						Messaggi.mostraMessaggio("L'input non e' valido.");
			    		break;
			    }
			} catch(NumberFormatException ex){
				Messaggi.mostraMessaggio("L'input non e' valido.");
				ex.printStackTrace();
			} catch(Exception ex){
				Messaggi.mostraMessaggioErrore(ex.getMessage());
				ex.printStackTrace();
			}
		}
	}
	
	public void menuOperazioniUtenteSuAnagrafica(){
		while(true){
			try{
				String stringaInput = Messaggi.getInput(
						"	Scegli l'opzione: \n"  +
						"	   1  per INSERISCI ANAGRAFICA\n" +
						"	   2  per MODIFICA ANAGRAFICA\n" +
						"      3  per VISUALIZZA ANAGRAFICA\n" +
						"      4  per CANCELLA ANAGRAFICA\n" +	
						"      0  per ESCI\n");
				risposta = Integer.parseInt(stringaInput);

			    switch(risposta) {
			    	case 1:
			    		this.controlloInserisciAnagrafica.start(utenteLoggato);
			    		break;
			    	case 2:
			    		this.controlloAggiornaAnagrafica.start(utenteLoggato);
			    		break;
			    	case 3:
			    		Messaggi.mostraLista(utenteLoggato.getAnagrafica().toString());
			    		break;
			    	case 4:
			    		this.controlloEliminaAnagrafica.start(utenteLoggato);
			    		break;
			    	case 0:
			    		return;
			    	default:
						Messaggi.mostraMessaggio("L'input non e' valido.");
			    		break;
			    }
			} catch(NumberFormatException ex){
				Messaggi.mostraMessaggio("L'input non e' valido.");
				ex.printStackTrace();
			} catch(Exception ex){
				Messaggi.mostraMessaggioErrore(ex.getMessage());
				ex.printStackTrace();
			}
		}
	}
	
	/**
	 * Menu dell'Area Management.
	 */
	private int getRispostaAreaManagement() {
		while(true){
			try {
				String stringaInput = Messaggi.getInput(  "Scegli l'opzione: \n"  +
						"	      1  per LISTA UTENTI\n" +
						"      2  per LISTA TUTTI I POST\n" +
						"      3  per CREA NUOVO UTENTE\n" +
						"      4  per MODIFICA UTENTE\n" +
						"      5  per MODIFICA POST\n" +
						"      6  per ELIMINA UTENTE\n" +
						"      7  per ELIMINA POST\n" +
						"      0  per TORNA AL MENU\n" );
				risposta = Integer.parseInt(stringaInput);
				return risposta;
			} catch(NumberFormatException ex) {
				Messaggi.mostraMessaggio("L'input non e' valido.");
				ex.printStackTrace();
			} catch(Exception ex){
				Messaggi.mostraMessaggioErrore(ex.getMessage());
				ex.printStackTrace();
			}
		}
	}
	
	/**
	 * Gestione operazioni dell'Area Management.
	 * @return 
	 */
	private void loginUtente() throws Exception{
		String datiUtente[] = Messaggi.uiLogin();
		
		if(datiUtente!=null){
			Utente utente=this.controlloCercaUtente.cercaEmail(datiUtente[0]);
			
			if(utente!=null){
				if(utente.getPassword().equals(datiUtente[1])){
					Messaggi.mostraMessaggio("Utente loggato con successo");
					this.setUtenteLoggato(utente);
					return;
				}
			}
			Messaggi.mostraMessaggio("Informazioni utente non corrette!");
		}
	}
	
	public void setUtenteLoggato(Utente utente) {
		this.utenteLoggato=utente;
	}
	
	public static void main(String args[]) {
		FacebookController fb=new FacebookController();
		fb.menuIniziale();
	}
}
